说明:
由于是公司的数据,所以对供应商进行映射处理,
数据下载连接(免费):数据下载
导包
import numpy as np
import pandas as pd
from datetime import datetime
from pandas import DataFrame
读取数据
data = pd.read_csv('./data.csv', index_col=0)
月份处理(例如:2020年12月)
处理函数
# 时间转化
# 时间转化
def month(v):
if isinstance(v, datetime):
return str(v.year) + '年' + str(v.month) + '月'
# 日期格式有可能为: 2020/12/7
elif '/' in str(v):
s = v.split('/')
return str(s[0]) + '年' + str(s[1]) + '月'
# 日期格式有可能为: 2020-9-7
elif '-' in str(v):
s = v.split('-')
return str(s[0]) + '年' + str(s[1]) + '月'
elif isinstance(v, str) or isinstance(v, int) or isinstance(v, float):
return np.nan
else:
return v
映射
for i,j in zip(['定金付款月份', '尾款付款月份', '赊账付款月份' ,'运费付款月份'],
['定金付款时间', '尾款付款时间', '赊账付款时间' ,'运费付款时间']):
data[i] = data[j].map(month)
根据供应商和月份分组分别进行聚合,
因为付款的月份没统一,所以对四个款项分别聚合求和
moneies = []
for i,j in zip(['定金', '尾款', '赊账', '运费'], ['定金付款月份', '尾款付款月份', '赊账付款月份', '运费付款月份']):
temp = DataFrame(money.loc[:,['供应商', i, j]].dropna())
# 去除,非数字的行
temp['condition'] = temp[i].map(lambda v:True if isinstance(v, int) or isinstance(v,float) else False)
temp = temp[temp.condition]
temp.drop(columns='condition', inplace=True)
temp = DataFrame(temp.groupby(['供应商', j]).sum())
temp.rename(index={'供应商':i+'供应商'}, inplace=True)
moneies.append(temp)
汇总,
看不懂的请点击:方法9,字典拆分
dic = {**moneies[0].to_dict(), **moneies[1].to_dict(),
**moneies[2].to_dict(), **moneies[3].to_dict()}
total = DataFrame(dic)
数据处理,并生成汇总
# 处理函数
def munber(v):
try:
v = float(v)
return v
except ValueError as e:
return 0
return 0
total.fillna(0, inplace=True)
# 去除数字之外的数据
for col in total.columns:
total[col] = total[col].map(lambda v:v if isinstance(v,float) or isinstance(v,int) else 0)
total.eval("汇总 = 定金+尾款+赊账+运费", inplace=True)
# 去除数字之外的数据
for col in total.columns:
total[col] = total[col].map(munber)
total.eval("汇总 = 定金+尾款+赊账+运费", inplace=True)